package com.tju.backend.service.business.impl;

import com.tju.backend.dao.sys_menu.SysMenuMapper;
import com.tju.backend.entity.SysMenu;
import com.tju.backend.service.business.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 菜单实现
 *
 * @USER: CLS
 */
@Service
public class SysMenuServiceImpl implements SysMenuService {

    @Autowired
    private SysMenuMapper menuMapper;

    @Override
    public List<SysMenu> getMenusByUserName(String loginName) {
        Integer withNodeId = 0;
        //跟节点数据
        List<SysMenu> followNode = new ArrayList<>();
        try {
            //查询所有数据
            List<SysMenu> list = menuMapper.getMenusByUserName(loginName);
            list.forEach(menu -> {
                //添加根节点数据
                if (menu.getMid().equals(withNodeId)) {
                    followNode.add(menu);
                }
            });
            //为跟节点数据添子节点数据
            followNode.forEach(fn -> {
                //递归获取子节点数据
                List<SysMenu> childNode = getChild(fn.getId(), list);
                //给根节点设置子节点
                fn.setChildren(childNode);
            });
        } catch (Exception e) {
            return null;
        }
        return followNode;
    }

    /**
     * 递归设置栏目的子节点
     *
     * @param id   父节点id
     * @param list 节点列表
     * @return
     */
    private List<SysMenu> getChild(Integer id, List<SysMenu> list) {
        //子节点数据
        List<SysMenu> childNode = new ArrayList<>();
        list.forEach(cn -> {
            //遍历所有节点把子节点添加到 childNode中
            if (cn.getMid().equals(id)) {
                childNode.add(cn);
            }
        });
        //递归设置子节点下的其它节点
        childNode.forEach(cn -> cn.setChildren(getChild(cn.getId(), list)));
        //如果节点下没有子节点，返回一个空List（递归退出）
        if (childNode.size() == 0) {
            return new ArrayList<>();
        }
        return childNode;
    }
}
